//T10089. 最优乘车
#include <iostream>
#include <vector>
#include <queue>
#include <cstdio>
using namespace std;
const int MAXN=500;
const int MAXM=100;
const int INF=0x7fffffff;
struct Stop
{
    int to;
    int line;
};
vector<Stop> G[MAXN+1];
int m,n;
string s;
int minhx[MAXN+1][MAXM+1];
queue<Stop> qu;

int main(){
    cin>>m>>n;
    getline(cin,s);
    for(int i=1;i<=m;i++){
        getline(cin,s);
        s+='#';
        int u=0,v=0;
        for(int k=0;k<s.length();k++){
            if (s[k]>='0'&&s[k]<='9') v=v*10+s[k]-'0';
            else if (v>0) {
                if (u>0){
                    G[u].push_back({v,i});
                }
                u=v;
                v=0;
            }
        }
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++) minhx[i][j]=INF;
    for(int j=1;j<=m;j++) minhx[1][j]=0;
    for(int k=0;k<G[1].size();k++){
        Stop st=G[1][k];
        minhx[st.to][st.line]=0;
        qu.push(st);
    }
    while(!qu.empty()){
        Stop cur=qu.front();
        qu.pop();
        for(int k=0;k<G[cur.to].size();k++){
            Stop next=G[cur.to][k];
            int newhx=next.line==cur.line? minhx[cur.to][cur.line]:minhx[cur.to][cur.line]+1;
            if (minhx[next.to][next.line]>newhx) {
                minhx[next.to][next.line]=newhx;
                qu.push(next);
            }
        }
    }
    int ans=INF;
    for(int j=1;j<=m;j++) if (ans>minhx[n][j]) ans=minhx[n][j];
    if (ans<INF) cout<<ans;
    else cout<<"NO";

}
